<?php

namespace App\Http\Controllers\Order;

use App\Jobs\AddOrderJob;
use App\Models\Address;
use App\Models\Cart;
use App\Models\Collections;
use App\Models\Huopin;
use App\Models\Order;
use App\Models\OrderList;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class OrderController extends Controller
{
    public function addOrder($ids){
        // 将订单交给队列处理,以最快的速度给用户提示
        // 执行队列任务,用dispatch传递参数
//        AddOrderJob::dispatch(auth()->id(),$ids);

        // 将ids切割成数组,循环数组获得商品数据
        $carts=Cart::whereIn('id',explode(',',$ids))->with('goods','huopin')->get();
        $totalPrice=0;
        foreach($carts as $cart){
            $totalPrice+=$cart['goods']['price']*$cart['num'];
        }
        $address=Address::where('user_id',auth()->id())->where('is_default',1)->first();
        // 新建订单数据
        $order=Order::create([
            'order_id'=>md5(time()),
            'totalPrice'=>$totalPrice,
            'address_id'=>$address['id'],
            'status'=>0,
            'user_id'=>auth()->id()
        ]);
        // 往订单列表中添加当前订单的列表数据
        foreach (explode(',',$ids) as $value){
            // 找到对应value值的购物车数据
            $cart=Cart::find($value);
            OrderList::create([
                'order_id'=>$order['id'],
                'goods_id'=>$cart['goods_id'],
                'huopin_id'=>$cart['huopin_id'],
                'num'=>$cart['num']
            ]);
            // 将当前用户所购买的所有商品的对应货品的库存减少
            foreach(explode(',',$ids) as $value){
                // 找到对应的购物车数据
                $cart=Cart::find($value);
                // 找到对应的货品数据
                $huopin=Huopin::find($cart['huopin_id']);
                // 更新库存数据
                $huopin->update(['kucun'=>$huopin['kucun']-$cart['num']]);
                // 从购物车表中删除对应的购物车数据
                $cart->destroy($value);
            }
        }

        // 跳转付款
        $order=Order::where('user_id',auth()->id())->orderBy('id','desc')->first();

        return redirect()->route('order.pay',$order);
    }

    public function pay(Order $order){
//        dd(123);
        require_once public_path("wechat/lib/WxPay.Api.php");
        require_once public_path("wechat/example/WxPay.NativePay.php");

        $notify = new \NativePay();

        //模式二
        /**
         * 流程：
         * 1、调用统一下单，取得code_url，生成二维码
         * 2、用户扫描二维码，进行支付
         * 3、支付完成之后，微信服务器会通知支付成功
         * 4、在支付成功通知中需要查单确认是否真正支付成功（见：notify.php）
         */
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("test");// 设置支付页面头部
        $input->SetAttach($order['order_id']);// 设置携带信息
        $input->SetOut_trade_no("sdkphp123456789".date("YmdHis"));// 设置订单号
        $input->SetTotal_fee("1");// 设置订单总金额,单位为分
        $input->SetNotify_url(asset('weixinpay/notify'));// 请求回调地址
        $input->SetTrade_type("NATIVE");// 设置交易类型
        $input->SetProduct_id("123456789");// 设置产品id

        $result = $notify->GetPayUrl($input);
        $url2 = $result["code_url"];


        return view('order.pay',compact('url2','order'));
    }

    public function notify(){
        // 我们需要从我们的服务器上获取到微信服务器发来的消息
        $xml=file_get_contents('php://input');
        if($xml){
            $data= simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
            file_put_contents('data.php',var_export($data,true));
            // 判断是否支付成功,支付成功则返回订单号,修改订单状态为1
            if($data->result_code=='SUCCESS'&&$data->return_code=='SUCCESS'){
                // 获取订单编号
                $orderId=$data->attach;
                // 找到订单编号对应的订单数据,修改状态为1
                $order=Order::where('order_id',$orderId)->first();
                $order->update(['status'=>1]);
                // 给微信回复响应,表示我们接收到了响应
                $returnXml='<xml>
    <return_code><![CDATA[SUCCESS]]></return_code>
    <return_msg><![CDATA[OK]]></return_msg>
    </xml>';
                return $returnXml;
            }
        }
    }

    public function checkStatus($orderId){
        // 用获取到的订单id去订单表中查询当前订单的状态,如果付款则返回成功;
        $order=Order::where('id',$orderId)->first();
        if($order['status']){
            return ['valid'=>1,'message'=>'付款成功'];
        }else{
            return ['valid'=>0,'message'=>'付款失败'];
        }
    }

    public function success(){
        // 加载支付成功页面
        return view('order.success');
    }

    public function myOrder(){
        $orders=Order::where('user_id',auth()->id())->get();
        return view('order.myorder',compact('collections','orders'));
    }

    public function orderList(Order $order){
        return view('order.orderList',compact('order'));
    }
}
